根据题目,最终我们希望数组的左侧全为非 0 元素,右侧全为 0 ,因此我们可以考虑使用快慢指针在遍历的过程中动态地原地操作数组。
具体来说,我们可以定义两个指针 left,right,其中我们希望对于慢指针 left,其每次所指向的是下一个非 0 元素交换来的位置,快指针 right 每次恒定向右前进一步用来遍历数组。
每当 right 遇到 0 时,我们直接跳过,因为我们不希望将 0 交换到数组前侧。否则,当 nums≠0 时,我们都将 nums[right] 与 nums[left] 进行交换,并将 left 指针向后进一步。
由于指针 left 只会在遇到非零元素时才会前进,因此它始终指向下一个非 0 元素交换来的位置,也就不会存在 left 将已排序好的非 0 元素交换回去的情况。
javascript
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function (nums) {
let left = 0,
right = -1
while (++right < nums.length) {
if (nums[right] === 0) {
continue
}
;[nums[left], nums[right]] = [nums[right], nums[left]]
left++
}
return nums
}